package com.example.tk2_8;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;

public class MainActivity extends AppCompatActivity   {
    TextView tv_state;//用于显示连接状态的文本框，包括：已连接和网络断开 2种状态
    EditText ip_edit; //用于引用IP地址编辑框
    EditText ip_port; //用于引用端口号编辑框
    Button bt_connect;//用于引用连接按钮
    Button bt_close;//用于引用关闭按钮

    EditText one_edit;//用于引用一楼大厅顶灯状态编辑框
    EditText two_edit;//用于引用二楼大厅顶灯状态编辑框
    EditText three_edit;//用于引用三楼大厅顶灯状态编辑框
    String ip;  //用于存储IP地址
    int port;  //用于存储端口号
    Socket ss;  //网络通信使用的Socket

    DataInputStream dataInputStream;  //网络通信使用的数据输入流
    byte buff[]=new byte[20]; //定义一个缓冲区，用于保存网络接收数据
    byte devID=0; //设备ID
    int  one=0;  //一楼大厅顶灯状态值
    int  two=0;  //二楼大厅顶灯状态值
    int  three=0;  //三楼大厅顶灯状态值


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        tv_state=(TextView)this.findViewById(R.id.tv_state);
        //任务3_1 ：根据组件id号R.id.ip_edit查找IP地址编辑框EditText组件的引用，使用变量ip_edit保存

        ip_edit=(EditText)this.findViewById(R.id.ip_edit);

        //结束任务3_1
        ip_port=(EditText)this.findViewById(R.id.ip_port);

        bt_connect=(Button)this.findViewById(R.id.bt_connect);
        bt_close=(Button)this.findViewById(R.id.bt_close);

        one_edit=(EditText)this.findViewById(R.id.edit_one);
        two_edit=(EditText)this.findViewById(R.id.edit_two);
        three_edit=(EditText)this.findViewById(R.id.edit_three);

        bt_connect.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {


                //任务3_2 ：从IP地址编辑框ip_edit获取IP地址并保存到变量ip

                ip=ip_edit.getText().toString().trim();

                //结束任务3_2

                port= Integer.parseInt(ip_port.getText().toString().trim());

                startThread();
            }
        });

        bt_close.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                try {
                    ss.close();
                    tv_state.setText("网络断开");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

    }

    void startThread()
    {
        new Thread(new Runnable(){
            @Override
            public void run() {
                //连接网路，如果不产生异常，说明连接成功，设置tv_state文本为已连接
                try {
                    //任务3_3 ：实现建立Socket网络连接，使用变量ss保存

                    ss=new Socket(ip,port);

                    //结束任务3_3

                    //数据输入流DataInputStream
                    dataInputStream=new DataInputStream(ss.getInputStream());


                    MainActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            //任务3_4 ：实现文本框tv_state显示为"已连接"状态

                            tv_state.setText("已连接");

                            //结束任务3_4
                        }

                    });

                } catch (IOException e) {
                    e.printStackTrace();
                }
                //循环接收数据，  解析和显示
                while(ss!=null && !ss.isClosed())
                {
                    try {
                        //网络接收数据，保存到buff
                        int len=dataInputStream.read(buff);

                        //如果接收的数据不符合通信协议，即不符合上传数据的数据结构，放弃不做任何处理，等待接收下一个数据；
                        if(len!=5 || buff[0]!=(byte)0x55 || buff[1]!=(byte)0xAA )  continue;

                        //根据通信协议提取设备ID数据 ，数据保存到变量devID
                        if(buff[3]==(byte)0x1B)  //设备类型电磁继电器
                        {

                            devID= buff[2];

                        }

                        // 根据通信协议提取一楼大厅顶灯状态数据保存到变量one
                        if(devID==(byte)0x01) //一楼大厅顶灯
                        {
                            one=0x0FF & buff[4];  //一楼大厅顶灯状态数据保存到变量one
                        }

                        //任务3_5 ：根据通信协议提取二楼大厅顶灯状态数据保存到变量two

                        if(devID==(byte)0x02) //一楼大厅顶灯
                        {
                            two=0x0FF & buff[4];  //一楼大厅顶灯状态数据保存到变量one
                        }

                        //结束任务3_5

                        // 根据通信协议提取三楼大厅顶灯状态数据保存到变量three
                        if(devID==(byte)0x03) //三楼大厅顶灯
                        {
                            three=0x0FF & buff[4];  //三楼大厅顶灯状态数据保存到变量three
                        }



                        //数据更新到UI界面：
                        MainActivity.this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {


                                //任务3_6 ：实现显示大厅顶灯状态， 根据状态值设置one two three 大厅顶灯状态编辑框
                                //  one_edit 用于引用一楼大厅顶灯状态编辑框;two_edit 用于引用二楼大厅顶灯状态编辑框;three_edit 用于引用三楼大厅顶灯状态编辑框;
                                if(devID==(byte)0x01) //一楼大厅顶灯
                                {
                                    one_edit.setText("开");  //一楼大厅顶灯状态数据保存到变量one
                                }
                                else{
                                    one_edit.setText("关");
                                }
                                if(devID==(byte)0x02) //一楼大厅顶灯
                                {
                                    two_edit.setText("开");  //一楼大厅顶灯状态数据保存到变量one
                                }
                                else{
                                    two_edit.setText("关");
                                }
                                if(devID==(byte)0x03) //一楼大厅顶灯
                                {
                                    three_edit.setText("开");  //一楼大厅顶灯状态数据保存到变量one
                                }
                                else{
                                    three_edit.setText("关");
                                }

                                //结束任务3_6
                            }
                        });


                    } catch (IOException e) {
                        e.printStackTrace();
                    }



                }


            }
        }).start();
    }

}